<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><title>梓琰苑</title><meta name="keywords" content="程序员,前端开发,后端开发,项目管理"><meta name="author" content="Milk Yang"><meta name="copyright" content="Milk Yang"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="description" content="不积跬步无以至千里，不积小流无以成江海">
<meta property="og:type" content="website">
<meta property="og:title" content="梓琰苑">
<meta property="og:url" content="http://yzb317415.gitee.io/blog/index.html">
<meta property="og:site_name" content="梓琰苑">
<meta property="og:description" content="不积跬步无以至千里，不积小流无以成江海">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://i.loli.net/2021/02/24/5O1day2nriDzjSu.png">
<meta property="article:author" content="Milk Yang">
<meta property="article:tag" content="程序员,前端开发,后端开发,项目管理">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://i.loli.net/2021/02/24/5O1day2nriDzjSu.png"><link rel="shortcut icon" href="/blog/img/favicon.png"><link rel="canonical" href="http://yzb317415.gitee.io/blog/"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><link rel="stylesheet" href="/blog/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6/css/all.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox.css" media="print" onload="this.media='all'"><script>const GLOBAL_CONFIG = { 
  root: '/blog/',
  algolia: undefined,
  localSearch: undefined,
  translate: undefined,
  noticeOutdate: undefined,
  highlight: {"plugin":"highlighjs","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":false},
  copy: {
    success: '复制成功',
    error: '复制错误',
    noSupport: '浏览器不支持'
  },
  relativeDate: {
    homepage: false,
    post: false
  },
  runtime: '',
  date_suffix: {
    just: '刚刚',
    min: '分钟前',
    hour: '小时前',
    day: '天前',
    month: '个月前'
  },
  copyright: undefined,
  lightbox: 'fancybox',
  Snackbar: undefined,
  source: {
    justifiedGallery: {
      js: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery@2/dist/fjGallery.min.js',
      css: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery@2/dist/fjGallery.min.css'
    }
  },
  isPhotoFigcaption: false,
  islazyload: false,
  isAnchor: false
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = {
  title: '梓琰苑',
  isPost: false,
  isHome: true,
  isHighlightShrink: false,
  isToc: false,
  postUpdate: '2022-06-22 18:31:32'
}</script><noscript><style type="text/css">
  #nav {
    opacity: 1
  }
  .justified-gallery img {
    opacity: 1
  }

  #recent-posts time,
  #post-meta time {
    display: inline !important
  }
</style></noscript><script>(win=>{
    win.saveToLocal = {
      set: function setWithExpiry(key, value, ttl) {
        if (ttl === 0) return
        const now = new Date()
        const expiryDay = ttl * 86400000
        const item = {
          value: value,
          expiry: now.getTime() + expiryDay,
        }
        localStorage.setItem(key, JSON.stringify(item))
      },

      get: function getWithExpiry(key) {
        const itemStr = localStorage.getItem(key)

        if (!itemStr) {
          return undefined
        }
        const item = JSON.parse(itemStr)
        const now = new Date()

        if (now.getTime() > item.expiry) {
          localStorage.removeItem(key)
          return undefined
        }
        return item.value
      }
    }
  
    win.getScript = url => new Promise((resolve, reject) => {
      const script = document.createElement('script')
      script.src = url
      script.async = true
      script.onerror = reject
      script.onload = script.onreadystatechange = function() {
        const loadState = this.readyState
        if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
        script.onload = script.onreadystatechange = null
        resolve()
      }
      document.head.appendChild(script)
    })
  
      win.activateDarkMode = function () {
        document.documentElement.setAttribute('data-theme', 'dark')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
        }
      }
      win.activateLightMode = function () {
        document.documentElement.setAttribute('data-theme', 'light')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
        }
      }
      const t = saveToLocal.get('theme')
    
          if (t === 'dark') activateDarkMode()
          else if (t === 'light') activateLightMode()
        
      const asideStatus = saveToLocal.get('aside-status')
      if (asideStatus !== undefined) {
        if (asideStatus === 'hide') {
          document.documentElement.classList.add('hide-aside')
        } else {
          document.documentElement.classList.remove('hide-aside')
        }
      }
    
    const detectApple = () => {
      if(/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)){
        document.documentElement.classList.add('apple')
      }
    }
    detectApple()
    })(window)</script><meta name="generator" content="Hexo 6.2.0"></head><body><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img is-center"><img src="https://i.loli.net/2021/02/24/5O1day2nriDzjSu.png" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="sidebar-site-data site-data is-center"><a href="/blog/archives/"><div class="headline">文章</div><div class="length-num">8</div></a><a href="/blog/tags/"><div class="headline">标签</div><div class="length-num">2</div></a><a href="/blog/categories/"><div class="headline">分类</div><div class="length-num">1</div></a></div><hr/></div></div><div class="page" id="body-wrap"><header class="full_page" id="page-header"><nav id="nav"><span id="blog_name"><a id="site-name" href="/blog/">梓琰苑</a></span><div id="menus"><div id="toggle-menu"><a class="site-page"><i class="fas fa-bars fa-fw"></i></a></div></div></nav><div id="site-info"><h1 id="site-title">梓琰苑</h1></div><div id="scroll-down"><i class="fas fa-angle-down scroll-down-effects"></i></div></header><main class="layout" id="content-inner"><div class="recent-posts" id="recent-posts"><div class="recent-post-item"><div class="post_cover left"><a href="/blog/2022/06/22/SpringAOP/" title="SpringAOP"><img class="post_bg" src="" onerror="this.onerror=null;this.src='/blog/img/404.jpg'" alt="SpringAOP"></a></div><div class="recent-post-info"><a class="article-title" href="/blog/2022/06/22/SpringAOP/" title="SpringAOP">SpringAOP</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-06-22T10:06:45.841Z" title="发表于 2022-06-22 18:06:45">2022-06-22</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/blog/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">学习笔记</a></span></div><div class="content">[TOC]
Spring的AOPAOP实现可分为两类


静态AOP实现AOP框架在编译阶段对程序进行修改，即实现对目标类型的增强，生成静态的AOP代理类（生成的*.class文件已经被改掉了，需要使用特定的编译器）。以AspectJ代表。
动态AOP实现AOP框架在巡行阶段动态生成AOP代理（在内存中以JDK动态代理或cglib动态地生成AOP代理类），以实现对目标对象的增强。以SpringAOP为代表


一般来说，静态AOP实现具有较好的性能，但需要使用特殊的编译器。动态AOP实现是纯Java实现，因此无须特殊的编译器，但是通常性能较差。
AOP的基本概念术语:


切面（Aspect）:切面用于组织多个Advice，Advice放在切面中定义
连接点（Joinpoint）：程序执行过程中明确的店，如方法的调用，或者异常的抛出。在SpringAOP中，连接点总是方法的调用
增强处理（Advice）：AOP框架在特定的切入点执行的增强处理。处理有“around”、“before”、“after”等类型
切入点（Ponitcut）：可以插入增强处理的连接点。简而言之，当某个连接点满足 ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/blog/2022/06/22/%E9%9C%80%E6%B1%82%E5%BC%80%E5%8F%91/" title="需求开发"><img class="post_bg" src="" onerror="this.onerror=null;this.src='/blog/img/404.jpg'" alt="需求开发"></a></div><div class="recent-post-info"><a class="article-title" href="/blog/2022/06/22/%E9%9C%80%E6%B1%82%E5%BC%80%E5%8F%91/" title="需求开发">需求开发</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-06-22T10:06:45.837Z" title="发表于 2022-06-22 18:06:45">2022-06-22</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/blog/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">学习笔记</a></span></div><div class="content">[TOC]
需求开发建立业务需求定义业务需求“业务需求”指的是一组信息，描述的是需要，在此需要的指导下，一个或多个项目交付一个解决方案和符合预期的最终业务成果。

确定预期业务收益 业务需求设置业务背景，提供衡量体系业务希望通过该项目达成怎样的收益。组织如果不清楚项目能为业务增加什么价值，就不要启动任何项目。为业务目标设置可度量的目标，然后定义指标，以便衡量是否在实现这些目标的正确轨道上。 业务分析师应能够确保有合适的干系人设置业务需求和引导获取活动，优先级排序和解决冲突。 业务收益必须体现对项目发起人和产品客户的真正价值。

产品愿景和项目范围 业务需求的两个核心元素是愿景和范围。 产品愿景简单描述最终产品将要达成什么业务目标。该产品可以作为业务需求的完整解决方案或解决方案的一部分。愿景描述产品大约是什么并且最终变成什么。它提供整个产品生命周期中决策的背景，让所有干系人团结在一个共同的目标之下。 项目范围明确当前项目或开发迭代应强调最终产品愿景的哪些部分。范围声明描述的是项目内外的边界。 

愿景作为一个整体应用于产品。随着产品战略定位或公司业务目标随时间而演化，愿景也要做出相对缓慢 ...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/blog/2022/06/22/%E6%B7%B1%E5%85%A5%E4%BD%BF%E7%94%A8%20Spring/" title="深入使用 Spring"><img class="post_bg" src="" onerror="this.onerror=null;this.src='/blog/img/404.jpg'" alt="深入使用 Spring"></a></div><div class="recent-post-info"><a class="article-title" href="/blog/2022/06/22/%E6%B7%B1%E5%85%A5%E4%BD%BF%E7%94%A8%20Spring/" title="深入使用 Spring">深入使用 Spring</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-06-22T10:06:45.833Z" title="发表于 2022-06-22 18:06:45">2022-06-22</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/blog/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">学习笔记</a></span></div><div class="content">深入使用 Spring两种后处理器

Bean后处理器：这种后处理器会对容器中的 Bean进行后处理，对 Bean 进行额外加强
容器后处理器：这种后处理器对 IoC 容器进行后处理，用于增强容器功能


Bean 后处理器Bean 后处理器是一种特殊的 Bean，这种特殊的 Bean 并不对外提供服务，它甚至无需 id 属性，它主要负责对容器中其他 Bean 执行后处理，例如为容器中的目标 Bean 生成代理等，这种Bean 被称作Bean后处理器
Bean后处理器会在 Bean 实例创建成功之后，对 Bean 实例进行进一步的增强处理，Bean 后处理器必须实现 BeanPostProcessor 接口，该接口包含如下两个方法：
1234// 该方法的第一个参数是系统即将进行后处理的 Bean 实例，第二个参数是该 Bean 的配置 idObject postProcessAfterInitialization(Object bean, String beanName)throws BeansException// 该方法的第一个参数是系统即将进行后处理的 Bean 实例，第二个参 ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/blog/2022/06/22/%E8%BD%AF%E4%BB%B6%E9%9C%80%E6%B1%82%E7%9A%84%E6%9C%AC%E8%B4%A8/" title="软件需求的本质"><img class="post_bg" src="" onerror="this.onerror=null;this.src='/blog/img/404.jpg'" alt="软件需求的本质"></a></div><div class="recent-post-info"><a class="article-title" href="/blog/2022/06/22/%E8%BD%AF%E4%BB%B6%E9%9C%80%E6%B1%82%E7%9A%84%E6%9C%AC%E8%B4%A8/" title="软件需求的本质">软件需求的本质</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-06-22T10:06:45.828Z" title="发表于 2022-06-22 18:06:45">2022-06-22</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/blog/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">学习笔记</a></span></div><div class="content">[TOC]
软件需求的本质在软件项目中，所有干系人的利益交接点主要集中在需求方面。正是由于需求是软件开发和项目管理活动的基础，因此所有干系人都应该致力于需求实践活动，这是打造一流产品的前提。
需求的层次和种类
业务需求描述组织为什么要执行系统（组织希望获得的业务收益）。其关注点在于组织或者提出系统要求的客户有哪些业务目标
用户需求描述了用户使用产品必须完成的目标或者任务，并且这个产品要能有为人提供价值。用户需求表达的是用户通过系统完成那些具体的工作。
功能需求说的是在特定条件下所展示出来的行为 ，主要描述开发人员需要实现的功能以便用户能够完成自己的任务（用户需求），进而满足业务需求
系统需求描述了人们对某个产品的需求，而这个产品由多个组件或者系统子集组成
业务规则包括公司政策、政府法规、工业标准以及计算算法。业务规则有时又引申出具体的质量特性，这些特性有以功能的方式由开发人员实现。特定的功能需求可以追溯到具体的业务规则。
非功能需求描述系统必须展现的属性或者特性，或者必须遵循的约束。强调的并不是系统要做什么，其重点在于展现系统做的有多棒。包括系统的易用性、安全性、性能等特征。
特性单个 ...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/blog/2022/06/22/Spring%E5%85%A5%E9%97%A8/" title="Spring入门"><img class="post_bg" src="" onerror="this.onerror=null;this.src='/blog/img/404.jpg'" alt="Spring入门"></a></div><div class="recent-post-info"><a class="article-title" href="/blog/2022/06/22/Spring%E5%85%A5%E9%97%A8/" title="Spring入门">Spring入门</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-06-22T10:06:45.824Z" title="发表于 2022-06-22 18:06:45">2022-06-22</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/blog/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">学习笔记</a></span></div><div class="content">[TOC]
Spring入门使用Spring容器Spring有两个核心接口，BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口。它们都可代表Spring容器，Spring容器是生成Bean实例的工厂，并管理容器中的Bean.
Spring容器BeanFactory是Spring最基本的容器，包含如下几个基本方法：
123456789// 判断Spring容器中是否包含id为name的Bean实例boolean containsBean(String name);// 获取Spring容器中输入requiredType类型的、唯一的Bean实例&lt;T&gt; T getBean(Class&lt;T&gt; requiredType);// 返回容器id为name的Bean实例Object getBean(String name);// 返回容器中id为name，并且类型类requiredType的Bean&lt;T&gt; T getBean(String name,class&lt;T&gt; r ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/blog/2022/06/22/Spring%E7%9A%84%E4%BA%8B%E5%8A%A1/" title="Spring 的事务"><img class="post_bg" src="" onerror="this.onerror=null;this.src='/blog/img/404.jpg'" alt="Spring 的事务"></a></div><div class="recent-post-info"><a class="article-title" href="/blog/2022/06/22/Spring%E7%9A%84%E4%BA%8B%E5%8A%A1/" title="Spring 的事务">Spring 的事务</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-06-22T10:06:45.819Z" title="发表于 2022-06-22 18:06:45">2022-06-22</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/blog/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">学习笔记</a></span></div><div class="content">[TOC]
Spring 的事务Spring支持的事务策略Java EE应用的传统事务有两种策略：全局事务和局部事务。全局事务由应用服务器管理，需要底层服务器的JTA(全称Java Transaction API ，即Java事务API)。局部事务和底层所采用的持久化技术相关，当采用JDBC持久化技术时，需要使用Connection对象来操作事务；而采用Hibernate持久化技术时，需要使用Session对象来操作事务。

术语


全局事务：Global Transactions
局部事务：Local Transactions
JTA：Java Transaction API(Java事务接口)
CMT：Container Managed Transaction(容器管理事务)
声明式事务管理：Declarative Transaction Management
编程式事务管理：Programmatic Transaction Management
JNDI：Java Naming and Directory Interface(Java命名和目录接口)



全局事务 全局事务由 ...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/blog/2022/06/22/Spring%E7%9A%84%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6/" title="Spring的缓存机制"><img class="post_bg" src="" onerror="this.onerror=null;this.src='/blog/img/404.jpg'" alt="Spring的缓存机制"></a></div><div class="recent-post-info"><a class="article-title" href="/blog/2022/06/22/Spring%E7%9A%84%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6/" title="Spring的缓存机制">Spring的缓存机制</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-06-22T10:06:45.814Z" title="发表于 2022-06-22 18:06:45">2022-06-22</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/blog/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">学习笔记</a></span></div><div class="content">[TOC]
Spring的缓存机制Spring的缓存不是一种具体的缓存实现方案，它底层需要依赖EhCache、Guava等具体的缓存工具。应用程序只要面向Spring缓存API编程，应用底层的缓存实现可以在不同的缓存之间自由切换，应用程序无须任何改变，只需要对配置文件略作修改即可。
启用Spring缓存为了启用Spring缓存，需要在配置文件中导入cache:命名空间。导入cache:命名空间之后，启用Spring缓存还需要两步：


在Spring配置文件中添加&lt;cache:annotation-driven cache-mangager=&quot;缓存管理器ID&quot;/&gt;,该元素指定Spring根据注解来启用Bean级别或方法的缓存
针对不同的缓存实现配置对应的缓存管理器


Spring内置缓存实现的配置Spring内置的缓存实现只是一种内存中的缓存，并非真正的缓存实现，因此通常指能用于简单的测试环境，不建议在实际项目中使用Spring内置的缓存实现。Spring内置的缓存实现使用SimpleCacheManager作为缓存管理器，使用SimpleCacheM ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/blog/2022/06/22/hello-world/" title="Hello World"><img class="post_bg" src="" onerror="this.onerror=null;this.src='/blog/img/404.jpg'" alt="Hello World"></a></div><div class="recent-post-info"><a class="article-title" href="/blog/2022/06/22/hello-world/" title="Hello World">Hello World</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-06-22T10:06:07.224Z" title="发表于 2022-06-22 18:06:07">2022-06-22</time></span></div><div class="content">Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post1$ hexo new &quot;My New Post&quot;

More info: Writing
Run server1$ hexo server

More info: Server
Generate static files1$ hexo generate

More info: Generating
Deploy to remote sites1$ hexo deploy

More info: Deployment
</div></div></div><nav id="pagination"><div class="pagination"><span class="page-number current">1</span></div></nav></div><div class="aside-content" id="aside-content"><div class="card-widget card-info"><div class="is-center"><div class="avatar-img"><img src="https://i.loli.net/2021/02/24/5O1day2nriDzjSu.png" onerror="this.onerror=null;this.src='/blog/img/friend_404.gif'" alt="avatar"/></div><div class="author-info__name">Milk Yang</div><div class="author-info__description">不积跬步无以至千里，不积小流无以成江海</div></div><div class="card-info-data site-data is-center"><a href="/blog/archives/"><div class="headline">文章</div><div class="length-num">8</div></a><a href="/blog/tags/"><div class="headline">标签</div><div class="length-num">2</div></a><a href="/blog/categories/"><div class="headline">分类</div><div class="length-num">1</div></a></div><a id="card-info-btn" target="_blank" rel="noopener" href="https://github.com/xxxxxx"><i class="fab fa-github"></i><span>Follow Me</span></a></div><div class="card-widget card-announcement"><div class="item-headline"><i class="fas fa-bullhorn fa-shake"></i><span>公告</span></div><div class="announcement_content">This is my Blog</div></div><div class="sticky_layout"><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item"><a class="thumbnail" href="/blog/2022/06/22/SpringAOP/" title="SpringAOP"><img src="" onerror="this.onerror=null;this.src='/blog/img/404.jpg'" alt="SpringAOP"/></a><div class="content"><a class="title" href="/blog/2022/06/22/SpringAOP/" title="SpringAOP">SpringAOP</a><time datetime="2022-06-22T10:06:45.841Z" title="发表于 2022-06-22 18:06:45">2022-06-22</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/blog/2022/06/22/%E9%9C%80%E6%B1%82%E5%BC%80%E5%8F%91/" title="需求开发"><img src="" onerror="this.onerror=null;this.src='/blog/img/404.jpg'" alt="需求开发"/></a><div class="content"><a class="title" href="/blog/2022/06/22/%E9%9C%80%E6%B1%82%E5%BC%80%E5%8F%91/" title="需求开发">需求开发</a><time datetime="2022-06-22T10:06:45.837Z" title="发表于 2022-06-22 18:06:45">2022-06-22</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/blog/2022/06/22/%E6%B7%B1%E5%85%A5%E4%BD%BF%E7%94%A8%20Spring/" title="深入使用 Spring"><img src="" onerror="this.onerror=null;this.src='/blog/img/404.jpg'" alt="深入使用 Spring"/></a><div class="content"><a class="title" href="/blog/2022/06/22/%E6%B7%B1%E5%85%A5%E4%BD%BF%E7%94%A8%20Spring/" title="深入使用 Spring">深入使用 Spring</a><time datetime="2022-06-22T10:06:45.833Z" title="发表于 2022-06-22 18:06:45">2022-06-22</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/blog/2022/06/22/%E8%BD%AF%E4%BB%B6%E9%9C%80%E6%B1%82%E7%9A%84%E6%9C%AC%E8%B4%A8/" title="软件需求的本质"><img src="" onerror="this.onerror=null;this.src='/blog/img/404.jpg'" alt="软件需求的本质"/></a><div class="content"><a class="title" href="/blog/2022/06/22/%E8%BD%AF%E4%BB%B6%E9%9C%80%E6%B1%82%E7%9A%84%E6%9C%AC%E8%B4%A8/" title="软件需求的本质">软件需求的本质</a><time datetime="2022-06-22T10:06:45.828Z" title="发表于 2022-06-22 18:06:45">2022-06-22</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/blog/2022/06/22/Spring%E5%85%A5%E9%97%A8/" title="Spring入门"><img src="" onerror="this.onerror=null;this.src='/blog/img/404.jpg'" alt="Spring入门"/></a><div class="content"><a class="title" href="/blog/2022/06/22/Spring%E5%85%A5%E9%97%A8/" title="Spring入门">Spring入门</a><time datetime="2022-06-22T10:06:45.824Z" title="发表于 2022-06-22 18:06:45">2022-06-22</time></div></div></div></div><div class="card-widget card-categories"><div class="item-headline">
            <i class="fas fa-folder-open"></i>
            <span>分类</span>
            
            </div>
            <ul class="card-category-list" id="aside-cat-list">
            <li class="card-category-list-item "><a class="card-category-list-link" href="/blog/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"><span class="card-category-list-name">学习笔记</span><span class="card-category-list-count">7</span></a></li>
            </ul></div><div class="card-widget card-tags"><div class="item-headline"><i class="fas fa-tags"></i><span>标签</span></div><div class="card-tag-cloud"><a href="/blog/tags/Spring/" style="font-size: 1.5em; color: #99a9bf">Spring</a> <a href="/blog/tags/%E9%9C%80%E6%B1%82%E5%BC%80%E5%8F%91%E4%B8%8E%E7%AE%A1%E7%90%86/" style="font-size: 1.1em; color: #999">需求开发与管理</a></div></div><div class="card-widget card-archives"><div class="item-headline"><i class="fas fa-archive"></i><span>归档</span></div><ul class="card-archive-list"><li class="card-archive-list-item"><a class="card-archive-list-link" href="/blog/archives/2022/06/"><span class="card-archive-list-date">六月 2022</span><span class="card-archive-list-count">8</span></a></li></ul></div><div class="card-widget card-webinfo"><div class="item-headline"><i class="fas fa-chart-line"></i><span>网站资讯</span></div><div class="webinfo"><div class="webinfo-item"><div class="item-name">文章数目 :</div><div class="item-count">8</div></div><div class="webinfo-item"><div class="item-name">本站访客数 :</div><div class="item-count" id="busuanzi_value_site_uv"></div></div><div class="webinfo-item"><div class="item-name">本站总访问量 :</div><div class="item-count" id="busuanzi_value_site_pv"></div></div><div class="webinfo-item"><div class="item-name">最后更新时间 :</div><div class="item-count" id="last-push-date" data-lastPushDate="2022-06-22T10:31:32.760Z"></div></div></div></div></div></div></main><footer id="footer"><div id="footer-wrap"><div class="copyright">&copy;2020 - 2022 By Milk Yang</div><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="darkmode" type="button" title="浅色和深色模式转换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside_config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button id="go-up" type="button" title="回到顶部"><i class="fas fa-arrow-up"></i></button></div></div><div><script src="/blog/js/utils.js"></script><script src="/blog/js/main.js"></script><script src="https://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox.umd.js"></script><div class="js-pjax"></div><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script></div></body></html>